package com.example.demo.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.fill.Column;
import org.springframework.stereotype.Service;

import java.util.Collections;

/*
 * @Author:大力王
 * @Date:2024/3/17-17-3:07
 * 开始了
 */
@Service
public class CodeGenerator implements CodeGeneratorAter {

    //项目包路径
    private final String packageNames = "com.example.demo";

    /**
     * 代码生成方法
     * @param tableName 表名
     * @param noController 是否不生成Controller
     */
    @Override
    public void generator(String tableName, boolean noController){
        String url = "jdbc:mysql://localhost:3306/springboot?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
        //获取工程地址
        String systemUrlJava = System.getProperty("user.dir")+"\\src\\main\\java\\";
        String systemUrlMapper = System.getProperty("user.dir")+"\\src\\main\\resources\\mapper\\";

        //数据库地址
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.author("言浠") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            //.enableSpringdoc()
                            //.fileOverride() // 覆盖已生成文件
                            .disableOpenDir() //禁止打开输出目录
                            .outputDir(systemUrlJava); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent(packageNames) // 设置父包名
                            .moduleName(null) // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, systemUrlMapper)); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {

                    builder.entityBuilder()
                            //有效列
                            .logicDeleteColumnName("deleted")
                            //lombok
                            .enableLombok()
                            //组件类型
                            .idType(IdType.AUTO)
                            //注解生成
                            .addTableFills(
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_time", FieldFill.INSERT_UPDATE)
                            );

                    builder.mapperBuilder().enableMapperAnnotation().build(); //启用@mapper注释
                    builder.controllerBuilder().enableHyphenStyle().enableRestStyle(); //启用驼峰转连字符样式
                    builder.addInclude(tableName);
                })
                .templateConfig(builder -> {
                    //不生成前端控制器
                    if(noController){
                        builder.disable(TemplateType.CONTROLLER);
                    }
                })
                .execute();
    }
}
